Quick overview

Current status

#library(nCov2019)
library(leaflet)
library(dplyr)
library(ggplot2)
library(plotly)
library(scales)
library(xts)
library(dygraphs)
library(corrplot)
COVID<-read.csv("covid_19_data.csv")
COVID_2<-read.csv("COVID19_5-Apr.csv")

Format date:

Date<-as.Date(COVID_2$Date, format="%m/%d/%y") 

COVID_2$Date2<-Date
COVID_updated<-COVID_2 %>% filter(Date2==max(Date2))
leaflet(width = "100%") %>% 
  addProviderTiles("CartoDB.DarkMatter") %>% 
  setView(lng = 0, lat = 10, zoom = 1.5) %>% 
  addCircleMarkers(data = COVID_updated, 
                   lng = ~ Long,
                   lat = ~ Lat,
                   radius = ~ log(Confirmed+1),
                   color = rgb(218/255,65/255,56/255),
                   fillOpacity = ~ ifelse(Confirmed > 0, 1, 0),
                   stroke = FALSE,
                   label = ~ paste(Province.State,",",Country.Region, ": ", Confirmed)
                   )

Current top 10 countries:

COVID_top<-COVID_2 %>% filter(Date2==max(Date2)) %>% 
  group_by(Country.Region) %>% summarise(Total_confirmed=sum(Confirmed)) %>% 
  top_n(10,Total_confirmed) %>% arrange(desc(Total_confirmed))
plot<-ggplot(data=COVID_top
       , aes(x=Total_confirmed,y=reorder(Country.Region,Total_confirmed))) +
  geom_bar(stat ="identity",alpha=0.8,fill="firebrick3") +
  geom_text(aes(label=Total_confirmed), vjust=0.5, hjust=0.9,color="black", size=3.5) +
  scale_x_continuous(labels = comma) +
  labs(title = paste("Top 10 countries with confirmed cases as of ",max(COVID_2$Date2)),
       x = "Confirmed cases",
       y = "Country") +
  theme_minimal()

ggplotly(plot,tooltip = c("x"),width=750)

Time distribution:

COVID_2_Day<- COVID_2 %>% group_by(Date2) %>% summarise(World_confirmed=sum(Confirmed),
                                                        World_deaths=sum(Deaths),
                                                        World_recovered=sum(Recovered))


COVID_Day_confirmed_series<-xts(COVID_2_Day$World_confirmed, order.by=COVID_2_Day$Date2)
COVID_Day_deaths_series<-xts(COVID_2_Day$World_deaths, order.by=COVID_2_Day$Date2)
COVID_Day_recovered_series<-xts(COVID_2_Day$World_recovered, order.by=COVID_2_Day$Date2)

Day_summary<-cbind(COVID_Day_confirmed_series,COVID_Day_deaths_series,COVID_Day_recovered_series)
dygraph(Day_summary, main = "SARS-COV2-outbreak: Total worldwide cases", 
        xlab="Date", ylab="Total cases",width = 750) %>% 
  dySeries("COVID_Day_confirmed_series", "Total cases",drawPoints = TRUE, 
           pointSize = 3, color=rgb(53/255,116/255,199/255)) %>% 
  dySeries("COVID_Day_deaths_series", "Total deaths",drawPoints = TRUE, 
           pointSize = 3, color=rgb(189/255,55/255,48/255)) %>% 
  dySeries("COVID_Day_recovered_series", "Total recovered",drawPoints = TRUE, 
           pointSize = 3, color=rgb(69/255,136/255,51/255)) %>% 
  dyRangeSelector()

Team members countries total cases:

COVID_2_Day_Lebanon<- COVID_2 %>% 
  filter(Country.Region %in% c("Lebanon")) %>% 
  group_by(Date2) %>% summarise(World_confirmed=sum(Confirmed))

COVID_2_Day_Chile<- COVID_2 %>% 
  filter(Country.Region %in% c("Chile")) %>% 
  group_by(Date2) %>% summarise(World_confirmed=sum(Confirmed))

COVID_2_Day_Colombia<- COVID_2 %>% 
  filter(Country.Region %in% c("Colombia")) %>% 
  group_by(Date2) %>% summarise(World_confirmed=sum(Confirmed))

COVID_2_Day_CostaRica<- COVID_2 %>% 
  filter(Country.Region %in% c("Costa Rica")) %>% 
  group_by(Date2) %>% summarise(World_confirmed=sum(Confirmed))


COVID_Day_series_Lebanon<-xts(COVID_2_Day_Lebanon$World_confirmed, order.by=COVID_2_Day_Lebanon$Date2)
COVID_Day_series_Chile<-xts(COVID_2_Day_Chile$World_confirmed, order.by=COVID_2_Day_Chile$Date2)
COVID_Day_series_Colombia<-xts(COVID_2_Day_Colombia$World_confirmed, order.by=COVID_2_Day_Colombia$Date2)
COVID_Day_series_CostaRica<-xts(COVID_2_Day_CostaRica$World_confirmed, order.by=COVID_2_Day_CostaRica$Date2)

Our_Countries<-cbind(COVID_Day_series_Lebanon,COVID_Day_series_Chile,COVID_Day_series_Colombia,COVID_Day_series_CostaRica)
dygraph(Our_Countries, main = "SARS-COV2-outbreak: Total cases by country", xlab="Date", ylab="Total cases",width = 750) %>% 
  dySeries("COVID_Day_series_Lebanon", "Lebanon",drawPoints = TRUE, 
           pointSize = 3, color=rgb(0,0,3/255)) %>% 
  dySeries("COVID_Day_series_Chile", "Chile",drawPoints = TRUE, 
           pointSize = 3,color=rgb(120/255,28/255,109/255)) %>% 
  dySeries("COVID_Day_series_Colombia", "Colombia",drawPoints = TRUE, 
           pointSize = 3,color=rgb(237/255,105/255,37/255)) %>% 
  dySeries("COVID_Day_series_CostaRica", "Costa Rica",drawPoints = TRUE,
           pointSize = 3,color=rgb(204/255,197/255,126/255)) %>% 
  dyRangeSelector()

Looking for correlations:

fig <- plot_ly(COVID_updated, x = ~Confirmed, y = ~Deaths, z = ~Recovered, width=750) %>% 
  add_markers(text= ~Country.Region ,hoverinfo= "text",
              marker = list(color=rgb(189/255,55/255,48/255))) %>% 
  layout(title="Confirmed cases Vs. Deaths Vs. Recovered", scene = list(
                    xaxis = list(title = 'Confirmed'),
                     yaxis = list(title = 'Deaths'),
                     zaxis = list(title = 'Recovered'))) 
fig

Human Development Index

HDI<-read.csv("Human Development Index (HDI)_2.csv",sep=";",dec=",")
COVID_Country<-COVID_2 %>% filter(Date2==max(Date2)) %>% 
  group_by(Country.Region) %>% summarise(Total_confirmed=sum(Confirmed),
                                         Total_deaths=sum(Deaths),
                                         Total_Recovered=sum(Recovered))

Remove after parentheses:

HDI$Country_2<-gsub("\\s*\\([^\\)]+\\)","",as.character(HDI$Country))
HDI$Country_2[HDI$Country_2=="United States"]<-"US"
HDI$Country_2[HDI$Country_2=="Korea"]<-"South Korea"

Population:

Population<-read.csv("World_population.csv",sep=";",dec=",")

Remove after commma:

Population$Country_Name_2<-gsub(",.*", "", as.character(Population$Country_Name))
Population$Country_Name_2[Population$Country_Name_2=="United States"]<-"US"
Population$Country_Name_2[Population$Country_Code=="KOR"]<-"South Korea"
Population$Country_Name_2[Population$Country_Code=="CZE"]<-"Czechia"

Natural Join:

COVID_3<- COVID_Country %>% inner_join(HDI,by=c("Country.Region"="Country_2")) %>% 
  inner_join(Population,by=c("Country.Region"="Country_Name_2")) %>% 
  select(Country.Region,Total_confirmed,Total_deaths,Total_Recovered,HDI_Rank_2018,Year_2018,
         Country_Code,Population_2018) %>% 
  mutate(Cases_million=(Total_confirmed/Population_2018)*1000000,
         Recovered_percentage=(Total_Recovered/Total_confirmed)*100)  

COVID_3<-COVID_3[!is.na(COVID_3$Population_2018),]

Plot the Human Development Index(HDI) Vs. the number of cases (applying a log transformation), and the proportion of recovered cases:

plot<-ggplot(data=COVID_3,aes(x=log(Cases_million),y=Year_2018,
                        size=Recovered_percentage,text=Country.Region)) +
  geom_point(color="black",fill=rgb(237/255,105/255,37/255),shape=21,alpha=0.6) +
  scale_size(range = c(3,15), name="Recovered \n percentage") +
  theme_minimal() + 
  theme(legend.position="bottom") +
  labs(title="HDI Vs. logarithmus of COVID-19 cases by million inhabitants \n and proportion of recovered",
       x="ln(Cases/1M population)",
       y="HDI")

ggplotly(plot,tooltip = c("text"),width=750)
COVID_numeric_1<-COVID_3 %>% mutate(Log_cases=log(Cases_million),
                                    Death_percentage=(Total_deaths/Total_confirmed)*100) %>% 
  select(Log_cases,Recovered_percentage,Death_percentage,Year_2018)

corrplot(cor(COVID_numeric_1),method = "number",tl.col="black",tl.srt=15)

LS0tCnRpdGxlOiAiQ09WSUQtMTkgT3V0YnJlYWs6IFdvcmxkd2lkZSBhbmFseXNpcyIKYXV0aG9yOiAiQW91biwgQ2FtYXJnbywgTWFydGluZXosUm9kcmlndWV6IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgdGhlbWU6IGNvc21vCiAgICAgCi0tLQohW10oQ29yb25hdmlydXMuanBnKQoKIyBRdWljayBvdmVydmlldwoKIyMgQ3VycmVudCBzdGF0dXMKCgpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9CiNsaWJyYXJ5KG5Db3YyMDE5KQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHh0cykKbGlicmFyeShkeWdyYXBocykKbGlicmFyeShjb3JycGxvdCkKYGBgCgpgYGB7cn0KQ09WSUQ8LXJlYWQuY3N2KCJjb3ZpZF8xOV9kYXRhLmNzdiIpCkNPVklEXzI8LXJlYWQuY3N2KCJDT1ZJRDE5XzUtQXByLmNzdiIpCmBgYAoKRm9ybWF0IGRhdGU6CmBgYHtyfQpEYXRlPC1hcy5EYXRlKENPVklEXzIkRGF0ZSwgZm9ybWF0PSIlbS8lZC8leSIpIAoKQ09WSURfMiREYXRlMjwtRGF0ZQpgYGAKCmBgYHtyfQpDT1ZJRF91cGRhdGVkPC1DT1ZJRF8yICU+JSBmaWx0ZXIoRGF0ZTI9PW1heChEYXRlMikpCmBgYAoKYGBge3J9CmxlYWZsZXQod2lkdGggPSAiMTAwJSIpICU+JSAKICBhZGRQcm92aWRlclRpbGVzKCJDYXJ0b0RCLkRhcmtNYXR0ZXIiKSAlPiUgCiAgc2V0VmlldyhsbmcgPSAwLCBsYXQgPSAxMCwgem9vbSA9IDEuNSkgJT4lIAogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IENPVklEX3VwZGF0ZWQsIAogICAgICAgICAgICAgICAgICAgbG5nID0gfiBMb25nLAogICAgICAgICAgICAgICAgICAgbGF0ID0gfiBMYXQsCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSB+IGxvZyhDb25maXJtZWQrMSksCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IHJnYigyMTgvMjU1LDY1LzI1NSw1Ni8yNTUpLAogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSB+IGlmZWxzZShDb25maXJtZWQgPiAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgIHN0cm9rZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+IHBhc3RlKFByb3ZpbmNlLlN0YXRlLCIsIixDb3VudHJ5LlJlZ2lvbiwgIjogIiwgQ29uZmlybWVkKQogICAgICAgICAgICAgICAgICAgKQpgYGAKCkN1cnJlbnQgdG9wIDEwIGNvdW50cmllczoKYGBge3J9CkNPVklEX3RvcDwtQ09WSURfMiAlPiUgZmlsdGVyKERhdGUyPT1tYXgoRGF0ZTIpKSAlPiUgCiAgZ3JvdXBfYnkoQ291bnRyeS5SZWdpb24pICU+JSBzdW1tYXJpc2UoVG90YWxfY29uZmlybWVkPXN1bShDb25maXJtZWQpKSAlPiUgCiAgdG9wX24oMTAsVG90YWxfY29uZmlybWVkKSAlPiUgYXJyYW5nZShkZXNjKFRvdGFsX2NvbmZpcm1lZCkpCmBgYAoKYGBge3J9CnBsb3Q8LWdncGxvdChkYXRhPUNPVklEX3RvcAogICAgICAgLCBhZXMoeD1Ub3RhbF9jb25maXJtZWQseT1yZW9yZGVyKENvdW50cnkuUmVnaW9uLFRvdGFsX2NvbmZpcm1lZCkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IixhbHBoYT0wLjgsZmlsbD0iZmlyZWJyaWNrMyIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPVRvdGFsX2NvbmZpcm1lZCksIHZqdXN0PTAuNSwgaGp1c3Q9MC45LGNvbG9yPSJibGFjayIsIHNpemU9My41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJUb3AgMTAgY291bnRyaWVzIHdpdGggY29uZmlybWVkIGNhc2VzIGFzIG9mICIsbWF4KENPVklEXzIkRGF0ZTIpKSwKICAgICAgIHggPSAiQ29uZmlybWVkIGNhc2VzIiwKICAgICAgIHkgPSAiQ291bnRyeSIpICsKICB0aGVtZV9taW5pbWFsKCkKCmdncGxvdGx5KHBsb3QsdG9vbHRpcCA9IGMoIngiKSx3aWR0aD03NTApCmBgYAoKVGltZSBkaXN0cmlidXRpb246CmBgYHtyfQpDT1ZJRF8yX0RheTwtIENPVklEXzIgJT4lIGdyb3VwX2J5KERhdGUyKSAlPiUgc3VtbWFyaXNlKFdvcmxkX2NvbmZpcm1lZD1zdW0oQ29uZmlybWVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JsZF9kZWF0aHM9c3VtKERlYXRocyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ybGRfcmVjb3ZlcmVkPXN1bShSZWNvdmVyZWQpKQoKCkNPVklEX0RheV9jb25maXJtZWRfc2VyaWVzPC14dHMoQ09WSURfMl9EYXkkV29ybGRfY29uZmlybWVkLCBvcmRlci5ieT1DT1ZJRF8yX0RheSREYXRlMikKQ09WSURfRGF5X2RlYXRoc19zZXJpZXM8LXh0cyhDT1ZJRF8yX0RheSRXb3JsZF9kZWF0aHMsIG9yZGVyLmJ5PUNPVklEXzJfRGF5JERhdGUyKQpDT1ZJRF9EYXlfcmVjb3ZlcmVkX3NlcmllczwteHRzKENPVklEXzJfRGF5JFdvcmxkX3JlY292ZXJlZCwgb3JkZXIuYnk9Q09WSURfMl9EYXkkRGF0ZTIpCgpEYXlfc3VtbWFyeTwtY2JpbmQoQ09WSURfRGF5X2NvbmZpcm1lZF9zZXJpZXMsQ09WSURfRGF5X2RlYXRoc19zZXJpZXMsQ09WSURfRGF5X3JlY292ZXJlZF9zZXJpZXMpCmBgYAoKCmBgYHtyfQpkeWdyYXBoKERheV9zdW1tYXJ5LCBtYWluID0gIlNBUlMtQ09WMi1vdXRicmVhazogVG90YWwgd29ybGR3aWRlIGNhc2VzIiwgCiAgICAgICAgeGxhYj0iRGF0ZSIsIHlsYWI9IlRvdGFsIGNhc2VzIix3aWR0aCA9IDc1MCkgJT4lIAogIGR5U2VyaWVzKCJDT1ZJRF9EYXlfY29uZmlybWVkX3NlcmllcyIsICJUb3RhbCBjYXNlcyIsZHJhd1BvaW50cyA9IFRSVUUsIAogICAgICAgICAgIHBvaW50U2l6ZSA9IDMsIGNvbG9yPXJnYig1My8yNTUsMTE2LzI1NSwxOTkvMjU1KSkgJT4lIAogIGR5U2VyaWVzKCJDT1ZJRF9EYXlfZGVhdGhzX3NlcmllcyIsICJUb3RhbCBkZWF0aHMiLGRyYXdQb2ludHMgPSBUUlVFLCAKICAgICAgICAgICBwb2ludFNpemUgPSAzLCBjb2xvcj1yZ2IoMTg5LzI1NSw1NS8yNTUsNDgvMjU1KSkgJT4lIAogIGR5U2VyaWVzKCJDT1ZJRF9EYXlfcmVjb3ZlcmVkX3NlcmllcyIsICJUb3RhbCByZWNvdmVyZWQiLGRyYXdQb2ludHMgPSBUUlVFLCAKICAgICAgICAgICBwb2ludFNpemUgPSAzLCBjb2xvcj1yZ2IoNjkvMjU1LDEzNi8yNTUsNTEvMjU1KSkgJT4lIAogIGR5UmFuZ2VTZWxlY3RvcigpCmBgYAoKClRlYW0gbWVtYmVycyBjb3VudHJpZXMgdG90YWwgY2FzZXM6CmBgYHtyfQpDT1ZJRF8yX0RheV9MZWJhbm9uPC0gQ09WSURfMiAlPiUgCiAgZmlsdGVyKENvdW50cnkuUmVnaW9uICVpbiUgYygiTGViYW5vbiIpKSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZTIpICU+JSBzdW1tYXJpc2UoV29ybGRfY29uZmlybWVkPXN1bShDb25maXJtZWQpKQoKQ09WSURfMl9EYXlfQ2hpbGU8LSBDT1ZJRF8yICU+JSAKICBmaWx0ZXIoQ291bnRyeS5SZWdpb24gJWluJSBjKCJDaGlsZSIpKSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZTIpICU+JSBzdW1tYXJpc2UoV29ybGRfY29uZmlybWVkPXN1bShDb25maXJtZWQpKQoKQ09WSURfMl9EYXlfQ29sb21iaWE8LSBDT1ZJRF8yICU+JSAKICBmaWx0ZXIoQ291bnRyeS5SZWdpb24gJWluJSBjKCJDb2xvbWJpYSIpKSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZTIpICU+JSBzdW1tYXJpc2UoV29ybGRfY29uZmlybWVkPXN1bShDb25maXJtZWQpKQoKQ09WSURfMl9EYXlfQ29zdGFSaWNhPC0gQ09WSURfMiAlPiUgCiAgZmlsdGVyKENvdW50cnkuUmVnaW9uICVpbiUgYygiQ29zdGEgUmljYSIpKSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZTIpICU+JSBzdW1tYXJpc2UoV29ybGRfY29uZmlybWVkPXN1bShDb25maXJtZWQpKQoKCkNPVklEX0RheV9zZXJpZXNfTGViYW5vbjwteHRzKENPVklEXzJfRGF5X0xlYmFub24kV29ybGRfY29uZmlybWVkLCBvcmRlci5ieT1DT1ZJRF8yX0RheV9MZWJhbm9uJERhdGUyKQpDT1ZJRF9EYXlfc2VyaWVzX0NoaWxlPC14dHMoQ09WSURfMl9EYXlfQ2hpbGUkV29ybGRfY29uZmlybWVkLCBvcmRlci5ieT1DT1ZJRF8yX0RheV9DaGlsZSREYXRlMikKQ09WSURfRGF5X3Nlcmllc19Db2xvbWJpYTwteHRzKENPVklEXzJfRGF5X0NvbG9tYmlhJFdvcmxkX2NvbmZpcm1lZCwgb3JkZXIuYnk9Q09WSURfMl9EYXlfQ29sb21iaWEkRGF0ZTIpCkNPVklEX0RheV9zZXJpZXNfQ29zdGFSaWNhPC14dHMoQ09WSURfMl9EYXlfQ29zdGFSaWNhJFdvcmxkX2NvbmZpcm1lZCwgb3JkZXIuYnk9Q09WSURfMl9EYXlfQ29zdGFSaWNhJERhdGUyKQoKT3VyX0NvdW50cmllczwtY2JpbmQoQ09WSURfRGF5X3Nlcmllc19MZWJhbm9uLENPVklEX0RheV9zZXJpZXNfQ2hpbGUsQ09WSURfRGF5X3Nlcmllc19Db2xvbWJpYSxDT1ZJRF9EYXlfc2VyaWVzX0Nvc3RhUmljYSkKCmBgYAoKYGBge3J9CmR5Z3JhcGgoT3VyX0NvdW50cmllcywgbWFpbiA9ICJTQVJTLUNPVjItb3V0YnJlYWs6IFRvdGFsIGNhc2VzIGJ5IGNvdW50cnkiLCB4bGFiPSJEYXRlIiwgeWxhYj0iVG90YWwgY2FzZXMiLHdpZHRoID0gNzUwKSAlPiUgCiAgZHlTZXJpZXMoIkNPVklEX0RheV9zZXJpZXNfTGViYW5vbiIsICJMZWJhbm9uIixkcmF3UG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgcG9pbnRTaXplID0gMywgY29sb3I9cmdiKDAsMCwzLzI1NSkpICU+JSAKICBkeVNlcmllcygiQ09WSURfRGF5X3Nlcmllc19DaGlsZSIsICJDaGlsZSIsZHJhd1BvaW50cyA9IFRSVUUsIAogICAgICAgICAgIHBvaW50U2l6ZSA9IDMsY29sb3I9cmdiKDEyMC8yNTUsMjgvMjU1LDEwOS8yNTUpKSAlPiUgCiAgZHlTZXJpZXMoIkNPVklEX0RheV9zZXJpZXNfQ29sb21iaWEiLCAiQ29sb21iaWEiLGRyYXdQb2ludHMgPSBUUlVFLCAKICAgICAgICAgICBwb2ludFNpemUgPSAzLGNvbG9yPXJnYigyMzcvMjU1LDEwNS8yNTUsMzcvMjU1KSkgJT4lIAogIGR5U2VyaWVzKCJDT1ZJRF9EYXlfc2VyaWVzX0Nvc3RhUmljYSIsICJDb3N0YSBSaWNhIixkcmF3UG9pbnRzID0gVFJVRSwKICAgICAgICAgICBwb2ludFNpemUgPSAzLGNvbG9yPXJnYigyMDQvMjU1LDE5Ny8yNTUsMTI2LzI1NSkpICU+JSAKICBkeVJhbmdlU2VsZWN0b3IoKQpgYGAKCiMgTG9va2luZyBmb3IgY29ycmVsYXRpb25zOgpgYGB7cn0KZmlnIDwtIHBsb3RfbHkoQ09WSURfdXBkYXRlZCwgeCA9IH5Db25maXJtZWQsIHkgPSB+RGVhdGhzLCB6ID0gflJlY292ZXJlZCwgd2lkdGg9NzUwKSAlPiUgCiAgYWRkX21hcmtlcnModGV4dD0gfkNvdW50cnkuUmVnaW9uICxob3ZlcmluZm89ICJ0ZXh0IiwKICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yPXJnYigxODkvMjU1LDU1LzI1NSw0OC8yNTUpKSkgJT4lIAogIGxheW91dCh0aXRsZT0iQ29uZmlybWVkIGNhc2VzIFZzLiBEZWF0aHMgVnMuIFJlY292ZXJlZCIsIHNjZW5lID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnQ29uZmlybWVkJyksCiAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZWF0aHMnKSwKICAgICAgICAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gJ1JlY292ZXJlZCcpKSkgCmZpZwpgYGAKCiMjIEh1bWFuIERldmVsb3BtZW50IEluZGV4CgpgYGB7cn0KSERJPC1yZWFkLmNzdigiSHVtYW4gRGV2ZWxvcG1lbnQgSW5kZXggKEhESSlfMi5jc3YiLHNlcD0iOyIsZGVjPSIsIikKYGBgCgpgYGB7cn0KQ09WSURfQ291bnRyeTwtQ09WSURfMiAlPiUgZmlsdGVyKERhdGUyPT1tYXgoRGF0ZTIpKSAlPiUgCiAgZ3JvdXBfYnkoQ291bnRyeS5SZWdpb24pICU+JSBzdW1tYXJpc2UoVG90YWxfY29uZmlybWVkPXN1bShDb25maXJtZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsX2RlYXRocz1zdW0oRGVhdGhzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbF9SZWNvdmVyZWQ9c3VtKFJlY292ZXJlZCkpCmBgYAoKUmVtb3ZlIGFmdGVyIHBhcmVudGhlc2VzOgpgYGB7cn0KSERJJENvdW50cnlfMjwtZ3N1YigiXFxzKlxcKFteXFwpXStcXCkiLCIiLGFzLmNoYXJhY3RlcihIREkkQ291bnRyeSkpCmBgYAoKYGBge3J9CkhESSRDb3VudHJ5XzJbSERJJENvdW50cnlfMj09IlVuaXRlZCBTdGF0ZXMiXTwtIlVTIgpIREkkQ291bnRyeV8yW0hESSRDb3VudHJ5XzI9PSJLb3JlYSJdPC0iU291dGggS29yZWEiCmBgYAoKUG9wdWxhdGlvbjoKYGBge3J9ClBvcHVsYXRpb248LXJlYWQuY3N2KCJXb3JsZF9wb3B1bGF0aW9uLmNzdiIsc2VwPSI7IixkZWM9IiwiKQpgYGAKClJlbW92ZSBhZnRlciBjb21tbWE6CmBgYHtyfQpQb3B1bGF0aW9uJENvdW50cnlfTmFtZV8yPC1nc3ViKCIsLioiLCAiIiwgYXMuY2hhcmFjdGVyKFBvcHVsYXRpb24kQ291bnRyeV9OYW1lKSkKYGBgCgpgYGB7cn0KUG9wdWxhdGlvbiRDb3VudHJ5X05hbWVfMltQb3B1bGF0aW9uJENvdW50cnlfTmFtZV8yPT0iVW5pdGVkIFN0YXRlcyJdPC0iVVMiClBvcHVsYXRpb24kQ291bnRyeV9OYW1lXzJbUG9wdWxhdGlvbiRDb3VudHJ5X0NvZGU9PSJLT1IiXTwtIlNvdXRoIEtvcmVhIgpQb3B1bGF0aW9uJENvdW50cnlfTmFtZV8yW1BvcHVsYXRpb24kQ291bnRyeV9Db2RlPT0iQ1pFIl08LSJDemVjaGlhIgpgYGAKCk5hdHVyYWwgSm9pbjoKYGBge3Isd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpDT1ZJRF8zPC0gQ09WSURfQ291bnRyeSAlPiUgaW5uZXJfam9pbihIREksYnk9YygiQ291bnRyeS5SZWdpb24iPSJDb3VudHJ5XzIiKSkgJT4lIAogIGlubmVyX2pvaW4oUG9wdWxhdGlvbixieT1jKCJDb3VudHJ5LlJlZ2lvbiI9IkNvdW50cnlfTmFtZV8yIikpICU+JSAKICBzZWxlY3QoQ291bnRyeS5SZWdpb24sVG90YWxfY29uZmlybWVkLFRvdGFsX2RlYXRocyxUb3RhbF9SZWNvdmVyZWQsSERJX1JhbmtfMjAxOCxZZWFyXzIwMTgsCiAgICAgICAgIENvdW50cnlfQ29kZSxQb3B1bGF0aW9uXzIwMTgpICU+JSAKICBtdXRhdGUoQ2FzZXNfbWlsbGlvbj0oVG90YWxfY29uZmlybWVkL1BvcHVsYXRpb25fMjAxOCkqMTAwMDAwMCwKICAgICAgICAgUmVjb3ZlcmVkX3BlcmNlbnRhZ2U9KFRvdGFsX1JlY292ZXJlZC9Ub3RhbF9jb25maXJtZWQpKjEwMCkgIAoKQ09WSURfMzwtQ09WSURfM1shaXMubmEoQ09WSURfMyRQb3B1bGF0aW9uXzIwMTgpLF0KYGBgCgpQbG90IHRoZSBIdW1hbiBEZXZlbG9wbWVudCBJbmRleChIREkpIFZzLiB0aGUgbnVtYmVyIG9mIGNhc2VzIChhcHBseWluZyBhIGxvZyB0cmFuc2Zvcm1hdGlvbiksIGFuZCB0aGUgcHJvcG9ydGlvbiBvZiByZWNvdmVyZWQgY2FzZXM6CmBgYHtyfQpwbG90PC1nZ3Bsb3QoZGF0YT1DT1ZJRF8zLGFlcyh4PWxvZyhDYXNlc19taWxsaW9uKSx5PVllYXJfMjAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1SZWNvdmVyZWRfcGVyY2VudGFnZSx0ZXh0PUNvdW50cnkuUmVnaW9uKSkgKwogIGdlb21fcG9pbnQoY29sb3I9ImJsYWNrIixmaWxsPXJnYigyMzcvMjU1LDEwNS8yNTUsMzcvMjU1KSxzaGFwZT0yMSxhbHBoYT0wLjYpICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygzLDE1KSwgbmFtZT0iUmVjb3ZlcmVkIFxuIHBlcmNlbnRhZ2UiKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgbGFicyh0aXRsZT0iSERJIFZzLiBsb2dhcml0aG11cyBvZiBDT1ZJRC0xOSBjYXNlcyBieSBtaWxsaW9uIGluaGFiaXRhbnRzIFxuIGFuZCBwcm9wb3J0aW9uIG9mIHJlY292ZXJlZCIsCiAgICAgICB4PSJsbihDYXNlcy8xTSBwb3B1bGF0aW9uKSIsCiAgICAgICB5PSJIREkiKQoKZ2dwbG90bHkocGxvdCx0b29sdGlwID0gYygidGV4dCIpLHdpZHRoPTc1MCkKYGBgCgoKYGBge3J9CkNPVklEX251bWVyaWNfMTwtQ09WSURfMyAlPiUgbXV0YXRlKExvZ19jYXNlcz1sb2coQ2FzZXNfbWlsbGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYXRoX3BlcmNlbnRhZ2U9KFRvdGFsX2RlYXRocy9Ub3RhbF9jb25maXJtZWQpKjEwMCkgJT4lIAogIHNlbGVjdChMb2dfY2FzZXMsUmVjb3ZlcmVkX3BlcmNlbnRhZ2UsRGVhdGhfcGVyY2VudGFnZSxZZWFyXzIwMTgpCgpjb3JycGxvdChjb3IoQ09WSURfbnVtZXJpY18xKSxtZXRob2QgPSAibnVtYmVyIix0bC5jb2w9ImJsYWNrIix0bC5zcnQ9MTUpCmBgYAoKCgoKCgoKCgoK